"""
返回值格式化工具模块
提供JSON返回值的表格显示和源格式查看功能
"""
import json
from typing import Dict, Any, Optional


class ResultFormatter:
    """返回值格式化器"""
    
    @staticmethod
    def format_result_as_table(result: Dict[str, Any]) -> str:
        """
        将JSON结果格式化为表格形式
        :param result: 节点返回的JSON结果
        :return: 表格形式的字符串
        """
        if not isinstance(result, dict):
            return str(result)
        
        # 表格的最大宽度配置
        max_key_width = 20
        max_value_width = 60
        
        # 创建表格头部
        table = ["\n" + "=" * (max_key_width + max_value_width + 5),
                f"{'键名':<{max_key_width}} | {'值':<{max_value_width}}",
                "=" * (max_key_width + max_value_width + 5)]
        
        # 遍历所有键值对
        for key, value in result.items():
            # 格式化值
            value_str = ResultFormatter._format_value(value, max_value_width)
            
            # 添加到表格
            table.append(f"{key:<{max_key_width}} | {value_str}")
        
        # 添加表格底部
        table.append("=" * (max_key_width + max_value_width + 5))
        
        # 示例
        table.append("\n示例:")
        table.append("键名通常包括: type(结果类型), path(文件路径), error(错误信息)等")
        table.append("值的类型可能是字符串、数字、列表或嵌套对象")
        
        return "\n".join(table)
    
    @staticmethod
    def _format_value(value: Any, max_width: int) -> str:
        """
        格式化单个值
        :param value: 要格式化的值
        :param max_width: 最大宽度
        :return: 格式化后的字符串
        """
        if isinstance(value, (str, int, float, bool, type(None))):
            value_str = str(value)
        elif isinstance(value, (list, tuple)):
            if len(value) == 0:
                value_str = "[]"
            elif len(value) <= 3 and all(isinstance(item, (str, int, float, bool)) for item in value):
                value_str = str(value)
            else:
                value_str = f"[{len(value)}个元素]"
        elif isinstance(value, dict):
            if len(value) == 0:
                value_str = "{}"
            else:
                value_str = f"{{{len(value)}个键值对}}"
        else:
            value_str = str(type(value).__name__)
        
        # 截断超长字符串
        if len(value_str) > max_width:
            value_str = value_str[:max_width-3] + "..."
        
        return value_str
    
    @staticmethod
    def format_result_as_json(result: Dict[str, Any]) -> str:
        """
        将结果格式化为缩进的JSON字符串
        :param result: 节点返回的JSON结果
        :return: 格式化的JSON字符串
        """
        try:
            return json.dumps(result, ensure_ascii=False, indent=2)
        except Exception:
            return str(result)
    
    @staticmethod
    def create_result_display(result: Dict[str, Any]) -> str:
        """
        创建结果显示字符串，包含表格视图和JSON源视图的提示
        :param result: 节点返回的JSON结果
        :return: 完整的显示字符串
        """
        if not isinstance(result, dict):
            return str(result)
        
        # 创建表格视图
        table_view = ResultFormatter.format_result_as_table(result)
        
        # 添加查看源格式的提示
        display_str = f"{table_view}\n\n"
        display_str += "▶ 要查看原始JSON格式，请点击结果区域的'查看源格式'按钮\n"
        display_str += "▶ 要再次显示表格视图，请点击'显示表格式数据'按钮"
        
        return display_str


# 创建单例实例供外部使用
result_formatter = ResultFormatter()